package org.jboss.narayana.compensations.internal; import org.jboss.weld.bean.builtin.BeanManagerProxy; import org.jboss.weld.manager.BeanManagerImpl; import org.jboss.weld.manager.BeanManagerLookupService; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.CDI; public class BeanManagerUtil { public static BeanManager getBeanManager() { return CDI.current().getBeanManager(); } public static <T> T createBeanInstance(Class<T> clazz) { return createBeanInstance(clazz, getBeanManager()); } @SuppressWarnings("unchecked") public static <T> T createBeanInstance(Class<T> clazz, BeanManager beanManager) { BeanManager classBeanManager = getClassBeanManager(clazz, beanManager); Bean<T> bean = (Bean<T>) classBeanManager.resolve(classBeanManager.getBeans(clazz)); if (bean == null) { throw new IllegalStateException("CDI BeanManager cannot find an instance of requested type " + clazz.getName()); } CreationalContext<T> context = classBeanManager.createCreationalContext(bean); return (T) classBeanManager.getReference(bean, clazz, context); } private static <T> BeanManager getClassBeanManager(Class<T> clazz, BeanManager beanManager) { BeanManagerImpl unwrappedBeanManager = BeanManagerProxy.unwrap(beanManager); return BeanManagerLookupService.lookupBeanManager(clazz, unwrappedBeanManager); } }